//结合数组的map方法、filter方法，可以实现 Map 的遍历和过滤
//（Map 本身没有map和filter方法）
const map0 = new Map()
    .set(1, 'a')
    .set(2, 'b')
    .set(3, 'c');

const map1 = new Map(
    [...map0].filter(([k, v]) => k < 3)
);
// 产生 Map 结构 {1 => 'a', 2 => 'b'}

const map2 = new Map(
    [...map0].map(([k, v]) => [k * 2, '_' + v])
);
// 产生 Map 结构 {2 => '_a', 4 => '_b', 6 => '_c'}

//此外，Map 还有一个forEach方法，与数组的forEach方法类似，也可以实现遍历
map2.forEach(function (value, key, map2) {
    console.log("Key: %s, Value: %s", key, value);
});

//forEach方法还可以接受第二个参数，用来绑定this。   
const reporter = {
    report: function (key, value) {
        console.log("Key: %s, Value: %s", key, value);
    }
};
console.log('----------')
map2.forEach(function (value, key, map2) {
    this.report(key, value);
}, reporter);

//Map 转为数组，Map 转为数组最方便的方法，就是使用扩展运算符（...）
//数组 转为 Map 将数组传入 Map 构造函数，就可以转为 Map。
new Map([
    [true, 7],
    [{ foo: 3 }, ['abc']]
])
// Map {
//   true => 7,
//   Object {foo: 3} => ['abc']
// }

// Map 转为对象
// 如果所有 Map 的键都是字符串，它可以无损地转为对象
function strMapToObj(strMap) {
    let obj = Object.create(null);
    for (let [k, v] of strMap) {
        obj[k] = v;
    }
    return obj;
}

const myMap = new Map()
    .set('yes', true)
    .set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
//如果有非字符串的键名，那么这个键名会被转成字符串，再作为对象的键名

//对象转为 Map
//对象转为 Map 可以通过Object.entries()
let obj = { "a": 1, "b": 2 };
let map = new Map(Object.entries(obj));
console.log(map)//Map(2) { 'a' => 1, 'b' => 2 }

//Map 转为 JSON

//JSON 转为 Map

